package com.jaws.core.common.util;

import java.math.BigDecimal;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * 数据处理工具类
 * 
 * @author lixin
 * @date 2018-04-24 16:17:58
 * @since v1.0.0
 */
public class DataUtil {

	/* 数值正则表达式(整数或者小数) */
	private static final String REG_NUMERIC = "[+-]?\\d*([.]?\\d*)?$";
	/* 数字正则表达式(数字) */
	private static final String REG_NUMBER = "\\d*$";
	/* 数字正则表达式(整数) */
	private static final String REG_INTEGER = "[0-9]{1,}$";
	/* 数字正则表达式(浮点数) */
	private static final String REG_DOUBLE = "\\d{0,}.\\d+$";
	/* IP地址正则表达式 */
	private static final String REG_IP = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
	/* 手机号码正则表达式 */
	// private static final String REG_MOBILE = "^1[3578][0-9]{9}|14[57][0-9]{8}$";
	// private static final String REG_MOBILE = "^1[3578][0-9]{9}|14[579][0-9]{8}|166[0-9]{8}|199[0-9]{8}$";
	private static final String REG_MOBILE = "^1[0-9]{10}$";
	/* 邮箱正则表达式 */
	// private static final String REG_EMAIL = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$";

	private static final String REG_EMAIL = "^[\\wa-z\\d-_A-Z]+(\\.[a-z\\d]+)*@([\\da-z](-[\\da-z])?)+(\\.{1,2}[a-zA-Z]+)+$";

	/**
	 * 判断输入的字符串只能是整数或者小数
	 * 
	 * @author qinqz
	 * @date 2017-02-23 14:04:50
	 * @since 1.0.0
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		// 这几种表达式是一样的意思
		// [+-]?\\d*([.]?\\d*)?$
		// [+-]?\\d{0,}([.]?\\d{0,})?$
		// [+-]{0,1}\\d{0,}([.]{0,1}\\d{0,}){0,1}$
		if (StringUtils.isNotBlank(str) && str.matches(REG_NUMERIC)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断输入的字符串是否是数字
	 * 
	 * @author qinqz
	 * @date 2017-02-23 14:05:03
	 * @since 1.0.0
	 * @param str
	 * @return
	 */
	public static boolean isNumber(String str) {
		if (StringUtils.isNotBlank(str) && str.matches(REG_NUMBER)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断输入的字符串是否是数字
	 * 
	 * @author qinqz
	 * @date 2017-02-23 14:05:19
	 * @since 1.0.0
	 * @param str
	 * @return
	 */
	public static boolean isInteger(String str) {
		if (StringUtils.isNotBlank(str) && str.matches(REG_INTEGER)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断输入的字符串是否是浮点数
	 * 
	 * @author qinqz
	 * @date 2017-02-23 14:05:31
	 * @since 1.0.0
	 * @param str
	 * @return
	 */
	public static boolean isDouble(String str) {
		if (StringUtils.isNotBlank(str) && str.matches(REG_DOUBLE)) {
			return true;
		}
		return false;
	}

	/**
	 * 数值格式化 四舍五入
	 * 
	 * @param amount BigDecimal 数值
	 * @param how int 保留几位小数, 默认取四舍五入
	 * @return BigDecimal
	 * @author qinqz
	 * @date 2017-02-23 13:50:46
	 * @since 1.0.0
	 */
	public static BigDecimal formatAmount(BigDecimal amount, int how) {
		return amount.setScale(how, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 数值格式化 四舍五入
	 * 
	 * @param amount BigDecimal 数值
	 * @param how int 保留几位小数
	 * @param round 是否进行四舍五入, 默认是true, true:结果四舍五入, false:结果不四舍五入
	 * @return BigDecimal
	 * @author qinqz
	 * @date 2017-02-23 13:50:00
	 * @since 1.0.0
	 */
	public static BigDecimal formatAmount(BigDecimal amount, int how, boolean round) {
		if (round) {
			return amount.setScale(how, BigDecimal.ROUND_HALF_UP);
		}
		return amount.setScale(how, BigDecimal.ROUND_DOWN);
	}

	/**
	 * 数值格式化
	 * 
	 * @param value double 数值
	 * @param how int 保留几位小数
	 * @return BigDecimal
	 * @author qinqz
	 * @date 2017-02-23 13:50:00
	 */
	public static BigDecimal formatNumbers(double value, int how) {
		return new BigDecimal(value).setScale(how, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 数值格式化
	 * 
	 * @param value double 数值
	 * @param how int 保留几位小数
	 * @return BigDecimal
	 * @author qinqz
	 * @date 2017-02-23 13:50:00
	 */
	public static double formatNumber(double value, int how) {
		return new BigDecimal(value).setScale(how, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 数值格式化
	 * 
	 * @param value double 数值
	 * @param how int 保留几位小数
	 * @param round 是否进行四舍五入, 默认是true, true:结果四舍五入, false:结果不四舍五入
	 * @author qinqz
	 * @date 2017-02-23 13:50:00
	 * @return
	 */
	public static BigDecimal formatNumbers(double value, int how, boolean round) {
		if (round) {
			return new BigDecimal(value).setScale(how, BigDecimal.ROUND_HALF_UP);
		}
		return new BigDecimal(value).setScale(how, BigDecimal.ROUND_DOWN);
	}

	/**
	 * 格式化double
	 * 
	 * @author zp
	 * @date 2017-05-08 15:35:05
	 * @since 1.0.0
	 * @param value
	 * @param scale 保留几位小数(四舍五入)
	 * @param isPercentage (是否百分比形式)
	 * @return
	 */
	public static double formatDouble(double value, int scale, boolean isPercentage) {
		int ratio = (int) Math.pow(10, scale);
		return (double) Math.round(value * (isPercentage ? 100 : 1) * ratio) / ratio;
	}

	/**
	 * 格式化double
	 * 
	 * @author zp
	 * @date 2017-05-08 15:35:05
	 * @since 1.0.0
	 * @param value
	 * @param scale 保留几位小数(四舍五入)
	 * @return
	 */
	public static double formatDouble(double value, int scale) {
		return formatDouble(value, scale, false);
	}

	/**
	 * 计算已经租用时长(unit:HOUR)
	 * 
	 * @param beginTime 开始使用时间
	 * @return hour
	 */
	public static double postTime(Date beginTime) {
		// 结束时间
		long end = new Date(System.currentTimeMillis()).getTime();
		// 四舍五入后, 转换成小时
		return DataUtil.formatNumbers(Double.parseDouble((end - beginTime.getTime()) + "") / 1000.0 / 60.0 / 60.0, 0).doubleValue();
	}

	/**
	 * 判断IP地址
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isIPAddress(String str) {
		if (StringUtils.isNotBlank(str) && str.matches(REG_IP)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断手机号码
	 * 
	 * @param mobile
	 * @return
	 */
	public static boolean isMobile(String mobile) {
		if (StringUtils.isNotBlank(mobile) && mobile.matches(REG_MOBILE)) {
			return true;
		}
		return false;
	}

	/**
	 * 判断Email
	 * 
	 * @param email
	 * @return
	 */
	public static boolean isEmail(String email) {
		// if (StringUtils.isNotBlank(email) && email.matches(REG_EMAIL)) {
		// return true;
		// }
		int num = 0;
		int leftNum = 0;
		int rightNum = 0;
		if (StringUtils.isNotBlank(email)) {
			email = email.trim();
			for (int i = 0; i < email.length(); i++) {
				if (email.substring(i, i + 1).equals("@")) {
					num++;
				} else {
					if (num == 0) {
						leftNum++;
					} else {
						rightNum++;
					}
				}
			}
		}
		if (num == 1 && leftNum > 0 && rightNum > 0) {
			return true;
		}
		return false;
	}

	/**
	 * HTML特殊支付转义
	 * 
	 * @param word
	 * @return
	 */
	public static String replaceWord(String word) {
		if (word != null && word.trim().length() > 0) {
			// 转义英文 双引号和单引号
			word = word.replaceAll("\"", "&quot;").replaceAll("\'", "&apos;");
		}
		return word;
	}

	public static void main(String[] args) {
		String email = "aa@@aa";
		System.out.println(isEmail(email));
	}
}
